package ejb.cbm.admin.facade;

import java.lang.reflect.InvocationTargetException;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import org.apache.commons.beanutils.BeanUtils;
import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import ejb.cbm.admin.bean.ParametroBean;
import ejb.cbm.admin.bean.TipoParametroBean;
import ejb.cbm.admin.entity.ParametroEntity;
import ejb.cbm.admin.entity.TipoParametroEntity;
import ejb.cbm.admin.local.ParametroFacadeLocal;
import ejb.cbm.admin.local.ParametroSessionLocal;
import ejb.cbm.admin.local.TipoParametroSessionLocal;
import ejb.cbm.commons.BaseFacade;
import ejb.cbm.commons.BaseRuntimeException;
import ejb.cbm.commons.StackTrace2String;
import ejb.cbm.seguridad.bean.UsuarioBean;
import ejb.com.bbva.cbm.util.CacheDatos;

/**
 * //@author miguel.arone
 * //@version 1.0
 * //@created 20-Aug-2011 7:22:36 PM
 */

////@Stateless
@Service("parametroFacadeLocal")
public class ParametroFacade extends BaseFacade implements ParametroFacadeLocal {
	
	static Logger logger = Logger.getLogger(CacheDatos.class.getName());
	//@EJB
	public TipoParametroSessionLocal tipoParametroSessionLocal;
	@Autowired
	public void setTipoParametroSessionLocal(
			TipoParametroSessionLocal tipoParametroSessionLocal) {
		this.tipoParametroSessionLocal = tipoParametroSessionLocal;
	}

	//@EJB
	public ParametroSessionLocal parametroSessionLocal;

	@Autowired
	public void setParametroSessionLocal(ParametroSessionLocal parametroSessionLocal) {
		this.parametroSessionLocal = parametroSessionLocal;
	}

	public List<TipoParametroBean> buscarTipos(){
		List<TipoParametroBean> beans = new ArrayList<TipoParametroBean>();
		List<TipoParametroEntity> entities =  new ArrayList<TipoParametroEntity>();
		TipoParametroBean bean = null;
		//TipoParametroEntity filtro = null;
		try{
			entities = tipoParametroSessionLocal.findAll();
			//entities = tipoParametroSessionLocal.findByFiltro(filtro);
			for(TipoParametroEntity entity : entities){
				bean = new TipoParametroBean();
				BeanUtils.copyProperties(bean, entity);
				beans.add(bean);
			}
		}catch(IllegalAccessException e){
			e.printStackTrace();logger.error(e);
			throw new BaseRuntimeException(StackTrace2String.stackTraceToString(e));
		}catch(InvocationTargetException e){
			e.printStackTrace();logger.error(e);
			throw new BaseRuntimeException(StackTrace2String.stackTraceToString(e));
		}
		return beans;
	}
	
	public TipoParametroBean findByCodigoUnico(String codigoUnico){		
		List<TipoParametroEntity> entities = null;
		List<ParametroBean> parametrosBeans = null;
		TipoParametroBean tipoBean = null;
		ParametroBean parametroBean = null;
		
		try{
			entities = tipoParametroSessionLocal.findByCodigounico(codigoUnico);			
			for(TipoParametroEntity tipoEntity : entities){
				tipoBean = new TipoParametroBean();
				BeanUtils.copyProperties(tipoBean, tipoEntity);				
				parametrosBeans = new ArrayList<ParametroBean>();
				if(tipoEntity.getParametros() == null){
					tipoEntity.setParametros(parametroSessionLocal.findByCodigoTipoParametro(tipoEntity.getCodigotipoparametro()));
				}
				for(ParametroEntity parametroentity : tipoEntity.getParametros()){
					parametroBean = new ParametroBean();
					parametroBean.setCodigoparametro(parametroentity.getCodigoparametro());
					parametroBean.setDescripcion(parametroentity.getDescripcion());
					parametroBean.setFechamodificacion(parametroentity.getFechamodificacion());
					parametroBean.setFecharegistro(parametroentity.getFecharegistro());
					parametroBean.setFlagactivo(parametroentity.getFlagactivo());
					parametroBean.setTipoparametro(tipoBean);
					parametroBean.setUsuariomodificacion(parametroentity.getUsuariomodificacion());
					parametroBean.setUsuarioregistro(parametroentity.getUsuarioregistro());
					parametroBean.setValoralfanumerico(parametroentity.getValoralfanumerico());
					parametroBean.setValornumerico(parametroentity.getValornumerico());
					parametrosBeans.add(parametroBean);
				}				
				tipoBean.setParametros(parametrosBeans);
			}			
		}catch(Exception e){
			e.printStackTrace();logger.error(e);
		}
		return tipoBean;
	}
	
	//gclv 21/09/2011
	public void save(ParametroBean parametroBean, UsuarioBean usuarioLogeado){
		ParametroEntity entity = null;
		TipoParametroEntity tipoParametroEntity = new TipoParametroEntity();
		if(parametroBean.getCodigoparametro() == null){
			entity = new ParametroEntity(
					parametroBean.getCodigoparametro(),
					//parametroBean.getTipoparametro(),
					tipoParametroEntity,
					parametroBean.getDescripcion(),
					parametroBean.getValornumerico(),
					parametroBean.getValoralfanumerico(),
					parametroBean.getFlagactivo(),
					usuarioLogeado.getCodigousuario(),
					new Date(),
					usuarioLogeado.getCodigousuario(),	
					new Date()
					//parametroBean.getCodParametroUnico()
			);
			parametroSessionLocal.save(entity);
		}else{
			entity = parametroSessionLocal.findById(parametroBean.getCodigoparametro());
			if(parametroBean.getDescripcion() != null) entity.setDescripcion(parametroBean.getDescripcion());
			//tipo parametro
			if(parametroBean.getValornumerico() != null) entity.setValornumerico(parametroBean.getValornumerico());
			if(parametroBean.getValoralfanumerico() != null) entity.setValoralfanumerico(parametroBean.getValoralfanumerico());
			if(parametroBean.getFlagactivo() != null) entity.setFlagactivo(parametroBean.getFlagactivo());
			entity.setUsuariomodificacion(usuarioLogeado.getCodigousuario());
			entity.setFechamodificacion(new Date());
			parametroSessionLocal.update(entity);
		}
	}

	/*gclv 16/09/2011
	public TipoParametroBean buscarTipoParametro(Long codigoTipoParametro){
		TipoParametroBean bean = new TipoParametroBean();
		TipoParametroEntity entity = new TipoParametroEntity();
		
		try{
			entity = tipoParametroSessionLocal.findById(codigoTipoParametro);
			BeanUtils.copyProperties(bean, entity);
			
		}catch(IllegalAccessException e){
			throw new BaseRuntimeException(StackTrace2String.stackTraceToString(e));
		}catch(InvocationTargetException e){
			throw new BaseRuntimeException(StackTrace2String.stackTraceToString(e));
		}
		
		return bean;
	}*/

	//gclv 16/09/2011
	public List<ParametroBean> buscarXFiltro(ParametroBean parametroBean){
		List<ParametroBean> beans = new ArrayList<ParametroBean>();
		List<ParametroEntity> entities =  parametroSessionLocal.findByFiltro(parametroBean);
		ParametroBean bean = null;
		TipoParametroBean tipoParametroBean= null;
		List<TipoParametroEntity> tipoParametroEntities = new ArrayList<TipoParametroEntity>();
		try{
			for(ParametroEntity entity : entities){
				bean = new ParametroBean();
				bean.setCodigoparametro(entity.getCodigoparametro());
				bean.setDescripcion(entity.getDescripcion());
				bean.setValornumerico(entity.getValornumerico());
				bean.setValoralfanumerico(entity.getValoralfanumerico());
				bean.setFlagactivo(entity.getFlagactivo());
				tipoParametroEntities = tipoParametroSessionLocal.findByFiltro(entity.getTipoparametro());
				for(TipoParametroEntity tipoParametroEntity : tipoParametroEntities){
					tipoParametroBean= new TipoParametroBean();
					BeanUtils.copyProperties(tipoParametroBean, tipoParametroEntity);
				}
				bean.setTipoparametro(tipoParametroBean);
				beans.add(bean);
			}
		}catch(Exception e){
			logger.info(e.getStackTrace());
		}
		return beans;
	}
	
	//gclv 21/09/2011
	public TipoParametroBean findByCodigoTipo(Long codigoParametro){
		TipoParametroBean tipoParametroBean = new TipoParametroBean();
		TipoParametroEntity tipoParametroEntity = new TipoParametroEntity();
		try{
			tipoParametroEntity = tipoParametroSessionLocal.findById(codigoParametro);
			tipoParametroBean.setCodigotipoparametro(tipoParametroEntity.getCodigotipoparametro());
			tipoParametroBean.setCodigounico(tipoParametroEntity.getCodigounico());
			tipoParametroBean.setTipo(tipoParametroEntity.getTipo());
			tipoParametroBean.setDescripcionparametro(tipoParametroEntity.getDescripcionparametro());
			tipoParametroBean.setFlagactivo(tipoParametroEntity.getFlagactivo());
		}catch(Exception e){
			e.printStackTrace();logger.error(e);
		}
		return tipoParametroBean;
	}
	
	//gclv 21/09/2011
	public ParametroBean buscar(Long codigoParametro) throws SQLException{
		ParametroBean parametroBean = new ParametroBean();
		ParametroEntity parametroEntity = parametroSessionLocal.findById(codigoParametro);
		//Connection con = null;
		TipoParametroBean tipoParametroBean= null;
		List<TipoParametroEntity> tipoParametroEntities = new ArrayList<TipoParametroEntity>();
		try{
			//con = super.getConnection();
			
			parametroBean.setCodigoparametro(parametroEntity.getCodigoparametro());
			parametroBean.setDescripcion(parametroEntity.getDescripcion());
			parametroBean.setValornumerico(parametroEntity.getValornumerico());
			parametroBean.setValoralfanumerico(parametroEntity.getValoralfanumerico());
			parametroBean.setFlagactivo(parametroEntity.getFlagactivo());
			
			tipoParametroEntities = tipoParametroSessionLocal.findByFiltro(parametroEntity.getTipoparametro());
			for(TipoParametroEntity tipoParametroEntity : tipoParametroEntities){
				tipoParametroBean = new TipoParametroBean();
				BeanUtils.copyProperties(tipoParametroBean, tipoParametroEntity);
			}
			parametroBean.setTipoparametro(tipoParametroBean);
			
		}catch(IllegalAccessException e){
			e.printStackTrace();logger.error(e);
			throw new BaseRuntimeException(StackTrace2String.stackTraceToString(e));
		}catch(InvocationTargetException e){
			e.printStackTrace();logger.error(e);
			throw new BaseRuntimeException(StackTrace2String.stackTraceToString(e));
		}/*finally{
			JdbcHelper.close(con);
		}*/
			return parametroBean;
	}
	
/*	public List<ParametroBean> obtenerParametroByTipo(Long tipoParametro){
		ParametroBean bean = null;
		List<ParametroBean> beans = new ArrayList<ParametroBean>();
		List<ParametroEntity> entities = null;
		
		try{
			entities = parametroSessionLocal.findByProperty(ParametroSession.CODIGOTIPOPARAMETRO, tipoParametro);
			
			for(ParametroEntity entity : entities){
				BeanUtils.copyProperties(bean, entity);
				
				beans.add(bean);
			}
			
		}catch(Exception e){
			e.printStackTrace();logger.error(e);
		}finally{
			
		}
		
		return beans;
	}*/
}
